/*
    isPrimeNumber 判断质数函数 

    @param  integer  number 需要判断的整数
    @return boolean  判断质数的结果

    判断输入的整数 是不是 质数
    如果是质数返回值是 true
    如果不是质数返回值是 false

*/
function isPrimeNumber(number) {
    for (var i = 2; i <= number / 2; i++) {
        if (number % i === 0) {
            return false;
        }
    }
    return true;
}

/*
    GCD 求最大公约数

    @param  integer num1    输入的数值1    
    @param  integer num2    输入的数值2
    @return integer 两个数值的最大公约数

    返回值 是 两个数值的最大公约数 
    输入的数值 大小顺序可以颠倒


*/

function GCD(num1, num2) {
    // 容错 判断 两个数值的大小顺序
    var min = Math.min(num1, num2);
    var max = Math.max(num1, num2);

    if (max % min === 0) {
        // 如果 大可以被小整除 小 就是 最大公约数
        return min;
    } else {
        // 不能整除 从 小-1 至 1 循环
        for (var i = min - 1; i >= 1; i--) {
            // 第一个 可以 整除 大 小 两个数值的 就是 最大公约数
            if (max % i === 0 && min % i === 0) {
                return i;
            }
        }
    }
}


/*
    LCM 最小公倍数
    
    @param  integer num1    输入的数值1    
    @param  integer num2    输入的数值2
    @return integer 两个数值的最小公倍数

    返回值 是 两个数值的最小公倍数
    输入的数值 大小顺序可以颠倒 


*/

function LCM(num1, num2) {
    var min = Math.min(num1, num2);
    var max = Math.max(num1, num2);

    if (max % min === 0) {
        return max;
    } else {
        for (var i = max + 1; i <= max * min; i++) {
            if (i % max === 0 && i % min === 0) {
                return i
            }
        }
    }
}

/*
    myGetDate    获取时间数据

    @param  string  timeStr     输入的时间字符串

*/

function myGetDate(timeStr) {
    // 创建时间对象
    // 根据 时间字符串 获取 对应的时间对象 
    // 如果 形参timeStr 存储 的是 undefined 证明 没有输入 时间字符串参数
    //      获取 当期时间的时间对象
    // 如果 形参timeStr 存储 的不是 undefined 证明 有输入 时间字符串参数
    //      获取 输入的实际字符串参数 对应的时间对象
    var time = timeStr === undefined ? new Date() : new Date(timeStr);

    // 获取年
    var year = time.getFullYear();

    // 获取月
    // 结果 + 1 是 对应的月份的数值
    var month = time.getMonth() + 1;

    // 获取日期
    var day = time.getDate();

    // 获取星期

    // 定义星期对应的数组
    var weekArr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
    // 获取的星期数据作为索引下标 从数组中获取对应的中文
    var week = weekArr[time.getDay()];

    // 获取小时
    var hours = time.getHours();

    // 获取分钟
    var minutes = time.getMinutes();

    // 获取秒
    var seconds = time.getSeconds();

    // 定义返回值 是 获取的时间数据
    // 以 对象的形式 返回数据
    return { year, month, day, week, hours, minutes, seconds };
}


/*
    myGetLeadTime   获取时间差函数
        @param  number/string   year        终止时间的年份
        @param  number/string   month       终止时间的月份
        @param  number/string   day         终止时间的日期
        @param  number/string   hours       终止时间的小时  默认值是 0
        @param  number/string   minutes     终止时间的分钟  默认值是 0
        @param  number/string   seconds     终止时间的秒    默认值是 0

*/

function myGetLeadTime( year , month , day , hours = 0 , minutes = 0 , seconds = 0 ) {
    // 创建当前时间对象
    var startTime = new Date();

    // 创建输入时间对象
    var endTime = new Date(`${year}-${month}-${day} ${hours}:${minutes}:${seconds}`);

    // 计算时间差 转化为 秒
    var time = parseInt((endTime.getTime() - startTime.getTime()) / 1000);

    // 将 时间差的秒数 转化为 天 小时 分钟 秒

    var d = parseInt(time / (24 * 60 * 60));
    var h = parseInt(time % (24 * 60 * 60) / (60 * 60));
    var m = parseInt(time % (60 * 60) / 60);
    var s = time % 60;

    // 返回值 就是 获取的时间差
    return { day : d , hours : h , minutes : m , seconds : s } ;
}

/*
    myGetUrlValObj 获取浏览器地址栏携带数据参数

    @return object 返回值是 参数对象形式的键值对

*/ 

function myGetUrlValObj(){
    // 创建对象 存储结果
    var obj = {} ;

    // 获取 浏览器地址栏参数 不要问号
    var str = window.location.search.substr( 1 );

    // 以 & 为 间隔 分割为数组
    var arr1 = str.split('&');

    // 循环遍历 arr1 以 = 等号 为间隔 分割键值对
    arr1.forEach( function( item ){
        // item 就是 键值对 
        var arr2 = item.split('=') ;

        // 将 arr2[0] 作为 键名 
        // 将 arr2[1] 作为 键值 
        // 设定给对象  

        // 以 键名 从 对象中 调用数据 
        if( obj[ arr2[0] ] === undefined ){
            // 如果 是 undefined 证明 对象中没有这个 键名 
            // 也就是 第一次写入 键名 和 键值 
            // 直接 新增 单元 设定 键名 和 键值 

            // 数据 从 十六进制 转化为 对应的 中文和符号等
            obj[ arr2[0] ] = window.decodeURIComponent( arr2[1] ) ;

        }else{
            // 如果 不是 undefined 证明 对象中 有这个 键名
            // 也就是 不是 第一次 写入 判断 键名 存储数据的数据类型
            if( typeof( obj[ arr2[0] ] ) !== 'object' ){
                // 如果 不是 object 证明 存储的不是数组 
                // 需要使用数组 存储 多个数据 
                obj[ arr2[0] ] = [ obj[ arr2[0] ] , window.decodeURIComponent( arr2[1] )];

            }else{
                // 如果 是 object 证明 键名 存储的是数组 
                // 直接 push() 写入数据
                obj[ arr2[0] ].push( window.decodeURIComponent( arr2[1] ) );
            }
        }
    })

    return obj ;
}

/*
    mySetVc 设定随机验证码函数

    @param  string / array  vcContent   设定验证码内容
    @param  integer         length      设定验证码长度
    @param  boolean         bool        验证码字符能不能重复

    @return string          vc          拼接的验证码字符串内容

*/

function mySetVc( vcContent = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' , length = 6 , bool = false){
    // 定义变量 存储 验证码字符结果
    var vc = '' ;

    // 循环 拼接 验证码字符串
    while( true ){

        // 根据参数执行不同的拼接程序
        if( bool ){
            // bool参数 设定为 true 验证码字符可以重复
            // 获取随机字符 直接 拼接写入 验证码字符串
            var num = parseInt( Math.random() * vcContent.length );

            vc += vcContent[ num ] ;

        }else{
            // bool参数 设定为 false 验证码字符不能重复
            // 获取随机字符 判断 不在 验证码中 再拼接写入
            var num = parseInt( Math.random() * vcContent.length );

            if( vc.indexOf( vcContent[ num ] ) === -1 ){
                vc += vcContent[ num ] ;
            }

        }

        // 验证码字符串长度 等于 设定的需要的长度
        if( vc.length === length ){
            // 终止循环
            break ;
        }
    }

    // 循环结束 返回值 是拼接的验证码字符串
    return vc ;

}

/*
    setColor 随机颜色
        @return string  随机颜色字符串

*/ 

function setColor(){
    return `rgb( ${parseInt( Math.random()*256 )} , ${parseInt( Math.random()*256 )} , ${parseInt( Math.random()*256 )} )` ;
}